<?php
namespace app\controller;

use app\BaseController;
use think\facade\View;

class DocsController extends BaseController
{
    /**
     * 文档根目录路径
     * @var string
     */
    protected $docPath;

    /**
     * 初始化
     */
    public function initialize()
    {
        parent::initialize();
        // 修正路径构建，确保路径正确
        $this->docPath = root_path(). '/Document/';
    }

    // private function getMdFiles($doc_path) {
    //     $mdFiles = [];
    //     $directoryIterator = new \RecursiveDirectoryIterator($doc_path);
    //     $iterator = new \RecursiveIteratorIterator($directoryIterator);
    //     foreach ($iterator as $fileInfo) {
    //         if ($fileInfo->isFile() && substr($fileInfo->getFilename(), -3) === '.md') {
    //             $mdFiles[] = $fileInfo->getPathname();
    //         }
    //     }
    //     return $mdFiles;
    // }

    /**
     * 获取文档列表
     * @return array
     */
    protected function getDocsList()
    {
        // 确保路径存在
        if (!is_dir($this->docPath)) {
            \think\facade\Log::error('文档目录不存在：' . $this->docPath);
            return [];
        }
        
        $files = glob($this->docPath . '*.md');
        // $files = $this->getMdFiles($this->docPath);
        $docs = [];
        \think\facade\Log::info('获得文档列表：'. $this->docPath . '*.md' . json_encode($files));
        
        // 如果glob返回false，设置为空数组
        if ($files === false) {
            \think\facade\Log::error('glob函数返回false，路径：' . $this->docPath . '*.md');
            return [];
        }
        
        foreach ($files as $file) {
            if (!file_exists($file)) {
                continue;
            }
            
            $content = file_get_contents($file);
            if ($content === false) {
                \think\facade\Log::error('无法读取文件：' . $file);
                continue;
            }
            
            // 获取文件第一行作为标题
            $firstLine = strtok($content, "\n");
            $title = trim($firstLine, "# \t\n\r\0\x0B");
            
            // 如果标题为空，使用文件名
            if (empty($title)) {
                $title = basename($file, '.md');
            }
            
            $docs[] = [
                'title' => $title,
                'file' => basename($file),
                'path' => $file
            ];
        }

        return $docs;
    }

    /**
     * 解析文档内容
     * @param string $filePath
     * @return string
     */
    protected function parseDocContent($filePath)
    {
        $content = file_get_contents($filePath);
        return $this->simpleMarkdownParse($content);
    }
    
    /**
     * 简单的Markdown解析器
     * @param string $content
     * @return string
     */
    protected function simpleMarkdownParse($content)
    {
        // 基础的Markdown转HTML
        $html = htmlspecialchars($content, ENT_QUOTES, 'UTF-8');
        
        // 转换标题
        $html = preg_replace('/^#### (.+)$/m', '<h4>$1</h4>', $html);
        $html = preg_replace('/^### (.+)$/m', '<h3>$1</h3>', $html);
        $html = preg_replace('/^## (.+)$/m', '<h2>$1</h2>', $html);
        $html = preg_replace('/^# (.+)$/m', '<h1>$1</h1>', $html);
        
        // 转换粗体和斜体
        $html = preg_replace('/\*\*(.+?)\*\*/', '<strong>$1</strong>', $html);
        $html = preg_replace('/\*(.+?)\*/', '<em>$1</em>', $html);
        
        // 转换代码块
        $html = preg_replace('/```([\s\S]*?)```/m', '<pre><code>$1</code></pre>', $html);
        
        // 转换行内代码
        $html = preg_replace('/`([^`]+)`/', '<code>$1</code>', $html);
        
        // 转换链接
        $html = preg_replace('/\[([^\]]+)\]\(([^\)]+)\)/', '<a href="$2" target="_blank">$1</a>', $html);
        
        // 转换表格（简单版本）
        $lines = explode("\n", $html);
        $result = [];
        $inTable = false;
        
        foreach ($lines as $line) {
            $line = trim($line);
            
            // 检查是否是表格行
            if (strpos($line, '|') !== false && strpos($line, '|') !== strlen($line) - 1) {
                if (!$inTable) {
                    $result[] = '<table class="table table-bordered">';
                    $inTable = true;
                }
                
                // 跳过分隔符行
                if (preg_match('/^\|[\s\-\|:]+\|$/', $line)) {
                    continue;
                }
                
                // 处理表格行
                $cells = explode('|', trim($line, '|'));
                $row = '<tr>';
                foreach ($cells as $cell) {
                    $cell = trim($cell);
                    $row .= '<td>' . $cell . '</td>';
                }
                $row .= '</tr>';
                $result[] = $row;
            } else {
                if ($inTable) {
                    $result[] = '</table>';
                    $inTable = false;
                }
                
                // 转换列表项
                if (preg_match('/^- (.+)$/', $line, $matches)) {
                    $result[] = '<li>' . $matches[1] . '</li>';
                } else {
                    $result[] = $line;
                }
            }
        }
        
        if ($inTable) {
            $result[] = '</table>';
        }
        
        $html = implode("\n", $result);
        
        // 包装列表项
        $html = preg_replace('/(<li>.*?<\/li>)/s', '<ul>$1</ul>', $html);
        $html = preg_replace('/<\/ul>\s*<ul>/', '', $html);
        
        // 转换换行
        $html = nl2br($html);
        
        return $html;
    }

    /**
     * 验证文档路径
     * @param string $filePath
     * @return bool
     */
    protected function validateDocPath($filePath)
    {
        return str_starts_with(realpath($filePath), realpath($this->docPath));
    }

    /**
     * 显示API文档页面
     */
    public function api()
    {
        try {
            $docs = $this->getDocsList();
            $defaultContent = '';

            if (!empty($docs)) {
                $defaultContent = $this->parseDocContent($docs[0]['path']);
            } else {
                $defaultContent = '<h1>暂无文档</h1><p>文档目录中没有找到Markdown文件。</p>';
            }

            View::assign([
                'docs' => $docs,
                'defaultContent' => $defaultContent
            ]);

            return View::fetch('docs/api');
        } catch (\Exception $e) {
            \think\facade\Log::error('API文档页面加载失败：' . $e->getMessage());
            
            // 返回错误页面或者简单的错误信息
            View::assign([
                'docs' => [],
                'defaultContent' => '<h1>加载错误</h1><p>文档加载失败：' . htmlspecialchars($e->getMessage()) . '</p>'
            ]);
            
            return View::fetch('docs/api');
        }
    }

    /**
     * 获取指定文档内容的API
     */
    public function getDoc()
    {
        $file = request()->param('file');
        $docPath = $this->docPath . $file;
        
        // 安全检查：确保文件在Document目录下
        if (!$this->validateDocPath($docPath)) {
            return json(['status' => 400, 'message' => '无效的文件路径']);
        }

        if (!file_exists($docPath)) {
            return json(['status' => 404, 'message' => '文档不存在']);
        }

        $html = $this->parseDocContent($docPath);
        return json(['status' => 200, 'content' => $html]);
    }
} 